import Request, { InterceptorHooks, ExpandAxiosResponse } from './request'
import { store } from '@/redux/index'
import { setToken } from '@/redux/modules/global'
import { message as Message } from 'antd'
import NProgress from '@/components/nprogress'

// 请求拦截器
const transform: InterceptorHooks = {
  requestInterceptor(config) {
    NProgress.start()
    // 请求头部处理，如添加token
    const token = store.getState().global.token
    if (token) {
      config!.headers!.Authorization = token
    }
    return config
  },
  requestInterceptorCatch(err) {
    NProgress.done()
    // 请求错误,这里可以使用Message进行提示
    Message.error(err, 3)
    return Promise.reject(err)
  },
  responseInterceptor(result) {
    NProgress.done()

    // 因为 axios 返回不支持扩展自定义配置，需要自己断言一下
    const res = result as ExpandAxiosResponse
    // 与后端约定的请求成功码
    const SUCCESS_CODE = [200, 201, 204]
    if (!SUCCESS_CODE.includes(res.data.status)) {
      // 全局错误消息提示
      if (res.config.requestOptions?.globalErrorMessage) {
        Message.error(res.data.message, 3)
      }
      return Promise.reject(res.data)
    }
    // 全局成功消息提示
    if (res.config.requestOptions?.globalSuccessMessage) {
      Message.success(res.data.message, 3)
    }
    // 存储token
    if (res.headers.authorization) {
      store.dispatch(setToken(res.headers.authorization))
    }
    // 请求返回值，建议将 返回值 进行解构
    return res.data
  },
  responseInterceptorCatch(err) {
    NProgress.done()
    const mapErrorStatus = new Map([
      [400, '请求方式错误'],
      [401, '请重新登录'],
      [403, '拒绝访问'],
      [404, '请求地址错误'],
      [500, '服务器错误']
    ])
    const message = mapErrorStatus.get(err.response.status) || '请求出错, 请稍后重试'
    Message.error(message, 3)
    return Promise.reject(err.response)
  }
}

const request = new Request({
  baseURL: '/api/api/private/v1/',
  timeout: 30000,
  intercetporHooks: transform
})

export default request
